/**
 * 1.什么是死锁：两个或多个并发进程中，如果一个进程持有A资源又在等待其他进程释放B资源，另一个进程持有B资源又在等待其他进程释放A资源，就会产出死锁
 * 2.死锁条件：
 *      1.互斥条件：一个资源一次只能被一个进程使用
 *      2.请求与保持条件：一个进程因请求某个资源而阻塞时，对已经获取到的资源不释放
 *      3.不剥夺：进程在获取资源，未完全使用完，不会被剥夺
 *      4.循环等待条件：若干进程之间形成一种头尾相接的环形资源等待关系
 * 3.处理死锁的基本方法：
 *      1.死锁预防：防止四个条件全部出现，破坏其中的一个或几个
 *      2.死锁避免：用算法避免，比如银行家算法，安全性算法，一般会导致系统吞吐量降低
 *      3.死锁检测和解除：
 *          1.鸵鸟策略：发生死锁，假装不知道，忽略它
 *          2.通过杀死进程消除死锁
 * 4.进程的状态：
 *      1.就绪状态
 *      2.执行状态
 *      3.阻塞状态
 * 5.java中死锁的解决办法
 *      1.tryLock方法，可以设置死锁的超时时间，如果超过这个时间没获取到锁，则会停止获取锁，然后发出警报啥的
 *      2.多使用JUC下的并发类，如concurrentHashMap，automicBoolean等等，比自己用什么wait,notify好多了
 *      3.尽量降低锁的粒度，根据业务情况，最好不要直接锁类对象
 *      4.尽量使用同步代码块，而不是同步方法，因为同步方法锁得范围较大
 *      5.最好避免锁的嵌套，因为很容易造成两个线程锁了相同的两个对象互相等待的情况
 *      6.实现类似银行家算法的机制，分配锁资源的时候，顺序分配，先计算一下会不会产生死锁
 *      7.死锁的检测手段：jstack -l 打印进程信息，找到wait to monitor的信息差不多就是死锁
 *  新版：
 *      1.java中什么情况会产生死锁？
 *          1.死锁是一种特定的程序状态，可以发生在两个或多个线程或者进程之间，由于循环依赖，互相对对方持有的资源加索，导致互相等待并且阻塞的状态。
 *          2.如果程序运行发生死锁，一般情况下需要重启服务才可以解决
 *          3.检测方式：用jps查看java进程，然后jstack -l pid打印堆存储文件，找到block状态，查找monitor wait to等字眼，可以查看到死锁
 *          4.或者用jvisualvm直接查看线程信息，有两个线程一直在互相等待，就证明有问题
 * 6.java中加锁的情况
 *      1.一般多线程处理数据，要对一个变量减一加一，判断大小的时候
 *      2.调用第三方接口，获取第三方接口token，然后设置到redis中保证全局token
 * 7.项目中哪里用到了分布式锁
 *      1.很少用，一般大型分布式数据处理的时候，保证一个唯一的计数的时候，但是其实用redis + lua来作吞吐量更高
 *      2.还有啥全局token的生成之类的，会用锁，具体看业务吧
 *      3.flink中会用，因为每个slot都是内存独立的，不用redis无法访问到其它slot中正在处理的一些东西
 *
 * @author
 * @created 2022/1/6 19:57
 */
public class Lock {
}
